package mit.aiti.androsecurity.mundo;

import android.annotation.SuppressLint;
import java.util.ArrayList;

/**
 * 
 */
public class Zona {

	private final static int  SENSOR = 1;
	private final static  int ACTUADOR = 2;
	private String direccionImagen;
	private int id;
	/**
	 * listas que contine los id's de los sensores 
	 * prendidos en el modo de opearacion
	 */
	private ArrayList<Integer> modoOperacionApagado;
	private ArrayList<Integer> modoOperacionDurmiendo;
	private ArrayList<Integer> modoOperacionPrendido;
	/**
	 * Listas con los sensores y actuadores en doble o multiple estado
	 */
	private ArrayList<DobleEstado> sensoresDobleEstado;
	private ArrayList<DobleEstado> actuadoresDobleEstado;
	private ArrayList<MultipleEstado> sensoresMultipleEstado;
	private ArrayList<MultipleEstado> actuadoresMultipleEstado;
 	private String nombre;
	private String ubicacion;

    /**
     * 
     */
     public Zona(int parId, String parNombre, String parUbicacion) {
        id = parId;
        nombre = parNombre;
        ubicacion = parUbicacion;
        modoOperacionApagado = new ArrayList<Integer>();
        modoOperacionDurmiendo = new ArrayList<Integer>();
        modoOperacionPrendido = new ArrayList<Integer>();
        sensoresDobleEstado = new ArrayList<DobleEstado>();
        sensoresMultipleEstado = new ArrayList<MultipleEstado>();
        actuadoresDobleEstado = new ArrayList<DobleEstado>();
        actuadoresMultipleEstado = new ArrayList<MultipleEstado>();
    }
     
     /**
      * 
      */
     int getId() {
         return id;
     }

     /**
      * 
      */
     String getNombre() {
         return nombre;
     }

     /**
      * 
      */
     String getUbicacion() {
         return ubicacion;
     }

     /**
      * 
      */
     void setId(int parId) {
         id = parId;
     }

     /**
      * 
      */
     void setNombre(String parNombre) {
         nombre = parNombre;
     }

     /**
      * 
      */
     void setUbicacion(String parUbicacion) {
         ubicacion = parUbicacion;
     }

    /**
     * 
     */
     public void agregarActuadorDobleEstado(String tipo, int parId, String parDescripcon) {
        DobleEstado dobleEstado  = new DobleEstado(ACTUADOR, tipo, parId, parDescripcon);
        actuadoresDobleEstado.add(dobleEstado);
    }

    /**
     * 
     * @param parMedida
     * @param parMaximo
     * @param parTipo
     * @param parMinimo
     * @param parId
     * @param parDescripcion
     */
	public void agregarActuadorMultipleEstado(double parMedida, double parMaximo, String parTipo, double parMinimo, int parId, String parDescripcion) {
       MultipleEstado multipleEstado = new MultipleEstado(ACTUADOR, parMedida, parMaximo, parMinimo, parTipo, parId, parDescripcion);
       actuadoresMultipleEstado.add(multipleEstado);
    }

    /**
     * 
     */
    
	public void agregarSensorDobleEstado(String tipo, int parId, String parDescripcon) {
        DobleEstado dobleEstado = new DobleEstado(SENSOR, tipo, parId, parDescripcon);
        sensoresDobleEstado.add(dobleEstado);
    }

    /**
     * 
     */
    public void agregarSensorMultipleEsado(double parMedida, double parMaximo, double parMinimo, String parTipo, int parId, String parDescripcion) {
        MultipleEstado multipleEstado = new MultipleEstado(SENSOR, parMedida, parMaximo, parMinimo, parTipo, parId, parDescripcion);
        sensoresMultipleEstado.add(multipleEstado);
    }

    /**
     * 
     */
     public DobleEstado buscarActuadorDobleEstado(int parId) {
        ArrayList<Integer> lista = new ArrayList<Integer>();
    	 for(DobleEstado i: actuadoresDobleEstado)
        	lista.add(i.getId());
    	int pos = buscar(lista, parId);
    	if(pos == -1)
    		return null;
    	return actuadoresDobleEstado.get(pos);
    }
     
     public MultipleEstado buscarActuadorMultipleEstado(int parId) {
        ArrayList<Integer> lista = new ArrayList<Integer>();
     	for(MultipleEstado i: actuadoresMultipleEstado)
           	lista.add(i.getId());
     	int pos = buscar(lista, parId);
     	if(pos == -1)
     		return null;
     	return actuadoresMultipleEstado.get(pos);
     }

    /**
     * 
     */
     public MultipleEstado buscarSensorMultipleEstado(int parId) {
    	 ArrayList<Integer> lista = new ArrayList<Integer>();
    	 for(MultipleEstado i: sensoresMultipleEstado)
        	lista.add(i.getId());
    	int pos = buscar(lista, parId);
    	if(pos == -1)
    		return null;
    	return sensoresMultipleEstado.get(pos);
    }
     
     public DobleEstado buscarSensorDobleEstado(int parId) {
    	 ArrayList<Integer> lista = new ArrayList<Integer>();
    	 for(DobleEstado i: sensoresDobleEstado)
        	lista.add(i.getId());
    	int pos = buscar(lista, parId);
    	if(pos == -1)
    		return null;
    	return sensoresDobleEstado.get(pos);
    }

    /**
     * Metodo que elimina un actuador segun su id<br>
     * <b>pre: </b>Las listas de actuadores debe encontrarse inicializadas<br>
     * <b>pos: </b>El actuador a sido eliminado 
     * @param parId , id del actuador a eliminar
     * @return true - si el actuador a sido eliminado || false - si el actuador no pudo ser eliminado
     */
    public Boolean eliminarActuador(int parId) {
        ArrayList<Integer> lista = new ArrayList<Integer>();
    	for(MultipleEstado i : actuadoresMultipleEstado)
        	lista.add(i.getId());
    	int pos = buscar(lista, parId);
    	if(pos == -1)
    	{
    		lista.clear();
    		for(DobleEstado i : actuadoresDobleEstado)
    			lista.add(i.getId());
    		pos = buscar(lista, parId);
    		if(pos == -1)
    			return false;
    		lista.remove(pos);
    		return true;
    	}
    	actuadoresMultipleEstado.remove(pos);
    	return true;
    }

    /**
     * Metodo que elimina un sensor segun su id<br>
     * <b>pre: </b>Las listas de sensores debe encontrarse inicializadas<br>
     * <b>pos: </b>El sensor a sido eliminado 
     * @param parId , id del sensor a eliminar
     * @return true - si el sensor a sido eliminado || false - si el senor no pudo ser eliminado
     */
    public Boolean eliminarSensor(int parId) {
    	ArrayList<Integer> lista = new ArrayList<Integer>();
    	for(MultipleEstado i : sensoresMultipleEstado)
        	lista.add(i.getId());
    	int pos = buscar(lista, parId);
    	if(pos == -1)
    	{
    		lista.clear();
    		for(DobleEstado i : sensoresDobleEstado)
    			lista.add(i.getId());
    		pos = buscar(lista, parId);
    		if(pos == -1)
    			return false;
    		lista.remove(pos);
    		return true;
    	}
    	sensoresMultipleEstado.remove(pos);
    	return true;
    }

    private int buscar( ArrayList<Integer> lista, int dato) {
    	 int inicio = 0;
    	 int fin = lista.size() - 1;
    	 int pos;
    	 while (inicio <= fin) {
    	     pos = (inicio+fin) / 2;
    	     if ( lista.get(pos) == dato )
    	       return pos;
    	     else if ( lista.get(pos) < dato ) {
    	  inicio = pos+1;
    	     } else {
    	  fin = pos-1;
    	     }
    	 }
    	 return -1;
    	    
    	}
}
